from docx import Document
from docx.shared import Pt
from docx.oxml.ns import qn
import re
import os
import tkinter.filedialog


def set_font(run, font_name='宋体', font_size=12):
    """设置字体为宋体四号"""
    run.font.name = font_name
    run._element.rPr.rFonts.set(qn('w:eastAsia'), font_name)
    run.font.size = Pt(font_size)


def renumber_figures_after(doc_path, target_figure):
    """
    在指定的docx文件中，从指定图片序号之后的同一组（x-y）的图片序号的z部分重新编号，
    按照文档中图片出现的顺序进行排序，并在新的z后面加上一个空格。
    同时将修改后的文本字体设置为宋体四号。

    参数：
    doc_path: str - docx文件的路径
    target_figure: str - 指定的图片序号（格式为"x-y-z"），从这个序号之后的同一组（x-y）的图片序号的z部分重新编号
    """
    if not os.path.exists(doc_path):
        print(f"文件不存在，请检查路径是否正确：{doc_path}")
        return

    doc = Document(doc_path)
    # 匹配格式为"图x-y-z"的序号，其中z的范围是0到999，并且z后面不能直接跟着四位数字
    figure_pattern = re.compile(r'(图)(\d+)-(\d+)-([0-9]{1,3})(?!\d{4})\s*')
    target_x, target_y, target_z = map(int, target_figure.split('-'))  # 分解目标序号为x, y, z

    # 找到所有需要重新编号的图片序号
    figures_to_renumber = []
    for paragraph in doc.paragraphs:
        match = figure_pattern.search(paragraph.text)
        if match:
            prefix, x, y, z = match.groups()
            x, y, z = map(int, (x, y, z))
            if x == target_x and y == target_y and z > target_z:  # 只处理z大于目标序号z的部分
                figures_to_renumber.append((paragraph, match.start(), match.end(), z))

    # 重新编号
    new_z = target_z + 1  # 从目标序号的下一个z值开始
    for paragraph, start, end, original_z in figures_to_renumber:
        # 获取段落文本
        text = paragraph.text
        # 构建新的序号
        new_figure = f"图{target_x}-{target_y}-{new_z} "  # 在新的z后面加上一个空格

        # 替换文本
        paragraph.text = text[:start] + new_figure + text[end:]

        # 设置新文本的字体
        for run in paragraph.runs:
            if run.text.strip():  # 只处理有实际内容的run
                set_font(run)

        new_z += 1  # 为下一个序号更新z值

    # 保存修改后的文档
    doc.save(doc_path)
    print(f"更新完成！共更新了{len(figures_to_renumber)}个图片序号。")


# 示例用法
doc_path = tkinter.filedialog.askopenfilename()
target_figure = input("请输入从哪个图片序号开始重新编号（格式为'x-y-z'，不包含'图'）：").strip()  # 手动输入目标图片序号
renumber_figures_after(doc_path, target_figure)